package com.tinet.sistReserva.ejb;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import com.tinet.sistReserva.DAO.SalaDao;
import com.tinet.sistReserva.model.Sala;
import com.tinet.sistReserva.model.util.SalaEncontradaException;
import com.tinet.sistReserva.model.util.SalaException;
import com.tinet.sistReserva.model.util.SalaNoEncontradaException;

/**
 * 
 * Clase que implementa los metodos de la interfaz InterfazSalaBean.
 * 
 * @author Frmancil
 */
@Stateless(mappedName = "salaBean", name = "salaBean")
public class SalaBean implements InterfazSalaBean {
    /**
     * Logger de clase.
     */
    private static final Logger LOG = Logger.getLogger(UsuarioBean.class);
    /**
     * Manejador de entidad y contexto de persistencia.
     */
    @PersistenceContext(unitName = "sistreserva_bd_fm")
    private EntityManager emSala;
    /**
     * Instancia de SalaDao para llamar a sus metodos.
     */
    private SalaDao daoSala;

    /**
     * 
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     * 
     */
    @PostConstruct
    public void init() {
        daoSala = new SalaDao(emSala);
    }

    /**
     * {@inheritDoc}
     */
    public void agregarSala(Sala nuevaSala) throws SalaException {
        Sala sala = buscarSalaAgregada(nuevaSala);
        if (sala != null) {
            throw new SalaEncontradaException(nuevaSala.getNombre());
        } else {
            daoSala.agregar(nuevaSala);
        }

    }

    /**
     * {@inheritDoc}
     */
    public void eliminarSala(Sala salaAEliminar) throws SalaException {
        if (buscarSala(salaAEliminar) == null) {
            throw new SalaNoEncontradaException(salaAEliminar.getNombre());
        } else {
            daoSala.eliminar(salaAEliminar);
        }

    }

    /**
     * {@inheritDoc}
     */
    public void actualizarSala(Sala salaAActualizar) throws SalaException {
        if (buscarSala(salaAActualizar) == null) {
            throw new SalaNoEncontradaException(salaAActualizar.getNombre());
        } else {
            daoSala.actualizar(salaAActualizar);
        }

    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Sala> listarSalas() {
        return daoSala.listar();
    }

    /**
     * {@inheritDoc}
     */
    public Sala buscarSalaAgregada(Sala salaABuscar) throws SalaException {
        Sala sala = null;
        try {
            sala = daoSala.buscar(salaABuscar);
        } catch (NoResultException e) {
            LOG.warn("Sala no encontrada " + salaABuscar.getId_sala());

        }
        return sala;
    }

    /**
     * {@inheritDoc}
     */
    public Sala buscarSala(Sala salaABuscar) throws SalaException {
        try {
            daoSala.buscar(salaABuscar);
        } catch (NoResultException e) {
            LOG.warn("Sala no encontrada " + salaABuscar.getNombre());
        }
        return (daoSala.buscar(salaABuscar));
    }

}
